home *** CD-ROM | disk | FTP | other *** search
/ ETO Development Tools 1 / ETO Development Tools 1.iso / Essentials / MacApp Documentation / MacApp AppleLink Messages / MacApp.Tech$ 6⁄29⁄90 / 1499-FailureHandler Class-Jun90 < prev    next >
Encoding:
Text File  |  1990-06-29  |  3.0 KB  |  108 lines  |  [TEXT/GEOL]

  1. Item    5059760                         27-June-90        10:10PDT
  2.  
  3. From:   PERRY.G                         Gregg, Perry
  4.  
  5. To:     MACAPP.TECH$                    MacApp Technical
  6.  
  7. cc:     MACAPP.NEWS$                    MacApp News
  8.  
  9. Sub:    FailureHandler Class
  10.  
  11. C++ MacAppers:
  12.  
  13. Check out Scott Collins' FailureHandler class based on a Jeff Alger's
  14. suggestion.  It reduces implementing exception handling in your C++ MacApp
  15. application to two lines of code (well almost).
  16.  
  17. Scott's code looks like real C++ to me.  He knows how to use it.  So don't be
  18. scared at first when you can't quite figure out what he is doing (read his
  19. comments in the header file).  Once you figure it out you'll see a few
  20. excellent examples of minimal C++ usage (meaning, one line doing the work of
  21. three;  see if you can spot the magic line).  Hint: "Think construction."
  22.  
  23. The example on how to actually use it was a little hard for me to understand so
  24. I've included a sample of my own below.
  25.  
  26. I never was,
  27. Perry 'Loose Energy' Gregg
  28.  
  29. // Do one of these for handles if needed.
  30. // We can get more creative and create a set of useful classes for this
  31. exception task in the future.
  32. // in YourFile.h
  33. //*****************************************************************************
  34. *************
  35. //  T P t r E r r o r H a n d l e r
  36. //*****************************************************************************
  37. *************
  38.  
  39. //-----------------------------------------------------------------------------
  40. ---------------------
  41. class TPtrErrorHandler : public FailureHandler
  42.    {
  43.    public:
  44.    // this constructor sets up pointers to the handles I might need to
  45.    // dispose
  46.    TPtrErrorHandler( Ptr *aPtr );
  47.  
  48.    public:
  49.    // beef
  50.    virtual voidRecover( short error, long message );
  51.  
  52.    private:
  53.    Ptr *fPtr;
  54.    };
  55.  
  56. // in YourFile.cp
  57. //-----------------------------------------------------------------------------
  58. ---------------------
  59. #pragma segment AClose
  60. TPtrErrorHandler::TPtrErrorHandler( Ptr *aPtr )
  61. { fPtr = aPtr; }
  62.  
  63.  
  64.  
  65. //-----------------------------------------------------------------------------
  66. ---------------------
  67. #pragma segment AClose
  68. void TPtrErrorHandler::Recover( short error, long message )
  69. {
  70.    if ( fPtr != nil )
  71.    DisposeIfPtr( *fPtr );
  72. }
  73.  
  74. // the way you use
  75. //-----------------------------------------------------------------------------
  76. ---------------------
  77. #pragma segment AWriteFile
  78.  
  79. pascal void CopyFilePiece(int fromRefNum, int toRefNum, long amount, int
  80. bufSize)
  81. {
  82.    longamtLeft;
  83.    longcount;
  84.    int readErr;
  85.    int writeErr;
  86.    Ptr aBufPtr;
  87.  
  88.    aBufPtr = NewPtr(bufSize);
  89.    FailNIL(aBufPtr);
  90.    amtLeft = amount;
  91.  
  92.    // equivalent to new;  plus, passes args to constructor
  93.    TPtrErrorHandler myHandler( &aBufPtr );
  94.  
  95.    while (amtLeft > 0)
  96.    {
  97.    count = Min(amtLeft, bufSize);
  98.    readErr = FSRead(fromRefNum, &count, aBufPtr);
  99.    FailOSErr(readErr);
  100.    writeErr = FSWrite(toRefNum, &count, aBufPtr);
  101.    FailOSErr(writeErr);
  102.    amtLeft = amtLeft - bufSize;
  103.    };
  104.    DisposPtr(aBufPtr);
  105.    myHandler.Revoke();
  106. }
  107.  
  108.